package com.example.testminio;

import io.minio.MinioClient;
import io.minio.ObjectStat;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class FileUploader {

	@Value("${minio.endpoint}")
	private String endpoint;

	@Value("${minio.accessKey}")
	private String accessKey;

	@Value("${minio.secretKey}")
	private String secretKey;

	/**
	 * 上传文件到 Minio 指定文件夹
	 * @param bucket Minio文件夹名称
	 * @param uploadFileName 在 Minio 中存储的文件名称
	 * @param sourceFile 上传的文件
	 * @throws Exception
	 */
	public void uploadFile(String bucket, String uploadFileName, String sourceFile) {
		try {
			MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
			// 检查文件夹是否已经存在
			boolean isExist = minioClient.bucketExists(bucket);
			if(!isExist) {
				log.info("新建 Bucket：{}", bucket);
				minioClient.makeBucket(bucket);
			}

			minioClient.putObject(bucket, uploadFileName, sourceFile);
			log.info("上传文件到 Minio 成功");
		}catch (Exception e){
			log.error("上传文件到 Minio 失败", e);
		}
	}

	/**
	 * 获取 Minio 文件访问路径
	 * @param bucket Minio文件夹名称
	 * @param uploadFileName 在 Minio中存储的文件名称
	 * @return
	 */
	public String getFileUrl(String bucket, String uploadFileName){
		try {
			MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
			String objectUrl = minioClient.getObjectUrl(bucket, uploadFileName);
			log.info("获取 Minio 文件访问路径为：{}",objectUrl);
			return objectUrl;
		}catch (Exception e){
			log.error("获取 Minio 文件访问路径失败", e);
		}
		return null;
	}

	/**
	 * 获取 Minio 文件信息
	 * @param bucket Minio文件夹名称
	 * @param uploadFileName 在 Minio中存储的文件名称
	 * @return
	 */
	public ObjectStat getFileInfo(String bucket, String uploadFileName){
		try {
			MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
			ObjectStat objectStat = minioClient.statObject(bucket, uploadFileName);
			log.info("获取 Minio 文件信息为：{}",objectStat);
			return objectStat;
		}catch (Exception e){
			log.error("获取 Minio 文件信息失败", e);
		}
		return null;
	}

	/**
	 * 下载 Minio 中的文件
	 * @param bucket Minio文件夹名称
	 * @param uploadFileName 在 Minio中存储的文件名称
	 * @param localSource 下载到本地的文件路径
	 */
	public void downloadFile(String bucket, String uploadFileName, String localSource){
		try {
			MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
			minioClient.getObject(bucket, uploadFileName, localSource);
			log.info("下载文件成功");
		}catch (Exception e){
			log.error("下载 Minio 文件失败", e);
		}
	}

}